package APE.Codage64;

public class Codage64 {

	
	
	public static void main(String[] args) {
	
		byte[] in= {16,3,3};
		int masque= 0x3f;
		int   buffer = ((in[0] & 0xff) << 16) +
				((in[1] & 0xff) << 8) +(in[2] & 0xff);

		
		
		System.out.print(onebytetocharB64((buffer >> 18)& masque));
		System.out.print(onebytetocharB64((buffer >> 12)& masque));
		System.out.print(onebytetocharB64((buffer >> 6)& masque));
		System.out.print(onebytetocharB64((buffer)& masque));	
		
	}
	 static public char onebytetocharB64(int in) {

	        char[] tab = new char[66];

	        tab[0] = 'A';
	        tab[1] = 'B';
	        tab[2] = 'C';
	        tab[3] = 'D';
	        tab[4] = 'E';
	        tab[5] = 'F';
	        tab[6] = 'G';
	        tab[7] = 'H';
	        tab[8] = 'I';
	        tab[9] = 'J';
	        tab[10] = 'K';
	        tab[11] = 'L';
	        tab[12] = 'M';
	        tab[13] = 'N';
	        tab[14] = 'O';
	        tab[15] = 'P';
	        tab[16] = 'Q';
	        tab[17] = 'R';
	        tab[18] = 'S';
	        tab[19] = 'T';
	        tab[20] = 'U';
	        tab[21] = 'V';
	        tab[22] = 'W';
	        tab[23] = 'X';
	        tab[24] = 'Y';
	        tab[25] = 'Z';
	        tab[26] = 'a';
	        tab[27] = 'b';
	        tab[28] = 'c';
	        tab[29] = 'd';
	        tab[30] = 'e';
	        tab[31] = 'f';
	        tab[32] = 'g';
	        tab[33] = 'h';
	        tab[34] = 'i';
	        tab[35] = 'j';
	        tab[36] = 'k';
	        tab[37] = 'l';
	        tab[38] = 'm';
	        tab[39] = 'n';
	        tab[40] = 'o';
	        tab[41] = 'p';
	        tab[42] = 'q';
	        tab[43] = 'r';
	        tab[44] = 's';
	        tab[45] = 't';
	        tab[46] = 'u';
	        tab[47] = 'v';
	        tab[48] = 'w';
	        tab[49] = 'x';
	        tab[50] = 'y';
	        tab[51] = 'z';
	        tab[52] = '0';
	        tab[53] = '1';
	        tab[54] = '2';
	        tab[55] = '3';
	        tab[56] = '4';
	        tab[57] = '5';
	        tab[58] = '6';
	        tab[59] = '7';
	        tab[60] = '8';
	        tab[61] = '9';
	        tab[62] = '+';
	        tab[63] = '/';
	        tab[64] = '=';

	        return tab[in];
	    }

}

	
	
	
	

	
	
	
	
	
	
	
	
	
	
	
	/**
	 * @param args
	 */
	
	/*public static void main(String[] args) {
		// TODO Auto-generated method stub

		
		String chaine = "tot" ;
		byte byte1, byte2,byte3, byte4,temp; 
		byte masque1 = (byte)0x3F;
		byte masque2 = (byte)0xC0;
		byte masque3 = (byte)0x0F;
		byte masque4 = (byte)0xF0;
		byte masque5 = (byte)0x03;
		byte masque6 = (byte)0xFC;
		
		byte flux[] = chaine.getBytes();
		int boucle = chaine.length()/3;
		if(boucle%chaine.length()!= 0)boucle=boucle+2;
		
		
	for (int i =0; i< boucle; i=i+3){
		
		
		/* Premier caractere (le plus simple)
		 * je dois juste r�cuperer les 6
		 * premiers bits de l'octetet en faire
		 * les 6 premiers bits de mon octet byte1
		 
		byte1=(byte) (flux[i] & masque1);	
		System.out.println (byte1);	
		
		
			/*deuxieme caractere ( je dois r�cuperer
			 * les deux derniers bits de l'octet2
			 * incrementer de 6 vers la droite (avec des zeros)
			 * r�cuperer les 4 premiers bits du deuxieme octet
			 * les d�caler vers la gaude de 2
			 * et faire un ou logique							
			 
		
		byte2 = (byte) (flux[i]& masque2);	
		byte2= (byte)( byte1 >>> 6);		 
		temp = (byte) (flux[i+1]& masque3);	
		temp = (byte) (temp << 2);			
		byte2= (byte)( temp |byte2);		
		System.out.println (byte2);
		
		/* troisieme caractere ( je dois r�cuperer
		 * les quatre derniers bits de l'octet2
		 * incrementer de 4 vers la droite (avec des zeros)
		 * r�cuperer les 2 premiers bits de l'octet 3
		 * les d�caler vers la gauche de 4
		 * et faire un ou logique							
		 
		byte3 = (byte) (flux[i+1]& masque4);	
		byte3= (byte)( byte3 >>> 4);
		temp = (byte) (flux[i+2]& masque5);	
		temp = (byte) (temp << 4);			
		byte3= (byte)( temp |byte3);		
		System.out.println (byte3);
		
		/* quatrieme caractere ( je dois r�cuperer
		 * les six derniers bits de l'octet3
		 * incrementer de 2 vers la droite (avec des zeros)							
		 
		byte4 = (byte) (flux[i+2]& masque6);	
		byte4= (byte)( byte4 >>> 2);
		System.out.println (byte4);
		int   buffer = ((int[0] & 0xff) << 16);
		
	}
			
			
	
			
		
		
		
		
	}

}*/
